package com.cloud.point.jvm;

import lombok.extern.slf4j.Slf4j;

/**
 * 运行时常量池测试
 *
 * @author 24373
 * @version 1.0
 * @date 2024-06-08 22:49
 */
@Slf4j
public class TestStringTable {

    public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        /**
         * 底层实现通过 StringBuilder 拼接字符串；再通过 toString 方法创建一个新对象；存在堆中
         * new StringBuilder().append(s1).append(s2).toString();
         */
        String s4 = s1 + s2;
        /**
         * string.equals方法通常用于比较两个对象的内容是否相同
         */
        log.info("s3 = s4: {}", s3 == s4);
        /**
         * 字符串是不可变的；javac 在编译阶段优化，已经确定结果为ab
         * 底层去运行时常量池中查找对象
         */
        String s5 = "a" + "b";
        log.info("s3 = s5: {}", s3 == s5);
        /**
         *  jdk1.8,intern方法会将字符串对象尝试放入运行时常量池中，如果有就不放入，没有就放入并返回运行时常量池中的对象
         */
        String s6 = s4.intern();
        log.info("s3 = s6: {}", s3 == s6);
        /**
         * 运行时常量池中已经存在ab，所以直接返回运行时常量池中的对象；和s7不一样，s7是存在于堆中的对象
         */
        String s7 = new String("a") + new String("b");
        log.info("s3 = s7: {}", s3 == s7);

    }

}